package modelo;

import titiritero.Dibujable;
import titiritero.Posicionable;
import utilitarios.*;

public abstract class Objeto implements Posicionable {
	
	protected static int TAMANIO_PIXEL = 30;
	
	protected FiguraGeometrica figura;
	protected double resistencia;
	protected Escenario escenario;
	
	public Objeto(Escenario unEscenario) {
		this.escenario = unEscenario;
	}
			
	@Override
    public double getX() {
		return this.figura.getCentroMasa().getCoordX();
	}

	@Override
    public double getY() {
		return this.figura.getCentroMasa().getCoordY();
	}
	
	protected void setFigura(FiguraGeometrica figura) {
		this.figura = figura;
	}
	
	protected void setPosicion(PuntoXY unPunto) {
		this.figura.setCentroMasa(unPunto);
	}
	
	public double getResistencia() {
		return this.resistencia;
	}
	
	public PuntoXY getPosicion() {
		return this.figura.getCentroMasa();
	}
	
	public Escenario getEscenario() {
		return this.escenario;
	}
	
	public FiguraGeometrica getFigura() {
		return this.figura;
	}
	
	public boolean enContactoCon(Objeto vecino) {
		return (this.figura.estaEnContactoCon(vecino.getFigura()));
	}
	
	public boolean solapadoCon(Objeto vecino) {
		return this.figura.estaSolapadoCon(vecino.getFigura());
	}
	
	/** 
	 * Dado un escenario, indica si el punto esta fuera de los limites del mismo.
	 * @param escenario
	 * @return boolean
	 */
	protected boolean estaFueraDeLimites(Escenario escenario) {
		if (this.getX() + this.figura.getDistanciaAlBorde() > escenario.getLongitud()) return true;
		if (this.getX() < this.figura.getDistanciaAlBorde() ) return true;
		if (this.getY() + this.figura.getDistanciaAlBorde() > escenario.getAltitud()) return true;
		if (this.getY() < this.figura.getDistanciaAlBorde() ) return true;
		return false;		
	}

	public abstract void vivir();
	
	protected abstract void morir();

	public boolean debeMorir() {
		return (this.resistencia == 0);
	}

	public void recibirDanio(int unDanio) {
		this.resistencia = this.resistencia - unDanio;
		if (this.resistencia <= 0) {
			this.morir();
		}
	}

	protected abstract void chocarConAlgoTank(TanqueAlgo unTanque);

	protected abstract void chocarConTanqueEnemigo(TanqueEnemigo unTanque);

	protected abstract void chocarConProyectil(Proyectil unProyectil);

	protected abstract void chocarConPared(Pared unaPared);

	public Dibujable crearDibujable() {
		return null;
	}

}
